Calculator 的 design pattern 在平常算是沒看到的,主要是之前專案的規範裡面有看到這樣子的做法,覺得也算滿清楚且實用的。目的在偏向計算像是某服務的剩餘使用天數總和,或者是目前的價格,過去五天的價格平均計算。
app/services
folderapp > services > service_price_calculator.rb
# frozen_string_literal: true
class ServicePriceCalculator
def initialize(services)
@price_statistic = Hash.new(0)
@services = services
end
def perform
sum_price_by_services
end
private
def sum_price_by_services
@services.each do |service|
@price_statistic[service.price] += service.added_price
end
@price_statistic
end
end
可能某個 presenter 內需要用到這個計算,這邊就可以與前篇的部分來做結合了。
app > presenters > service_price_presenter.rb
# frozen_string_literal: true
class ServicePricePresenter
include Enumerable
def initialize(services)
@services = services
prepare_statistics
end
def each(&_block)
@statistics.each do |s|
yield ...
end
end
private
def prepare_statistics
calculate_result = ServicePriceCalculator.new(@services).perform
@statistics = calculate_result #...
end
end
其實東西滿簡單的,只是整理成一個好理解的獨立 service 來命名,也在閱讀上更好理解一個東西裡面只做單一事件,在撰寫測試上也更好寫。